{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Import Libraries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from src.condition_diffusion.ddpm import DDPM\n",
    "from src.condition_diffusion.unet import UNet\n",
    "from src.data.mnist import get_mnist_loader_and_transform\n",
    "from src.data.cifar10 import get_cifar10_loader_and_transform\n",
    "from torchvision.utils import save_image, make_grid\n",
    "from src.condition_diffusion.train import train\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import torch.backends\n",
    "import torch.backends.mps\n",
    "import os"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Configuration of model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "T = 1000\n",
    "dataset = \"mnist\" # can be \"cifar10\" or \"mnist\"\n",
    "\n",
    "PATH_TO_READY_MODEL = None # input path for ready model\n",
    "\n",
    "PATH_TO_SAVE_MODEL = \"model.pth\"\n",
    "EPOCHS = 100 # for cifar10 it should be more than 1000, but for mnist 20-100 should be okay"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",
    "# For Mac OS\n",
    "if torch.backends.mps.is_available():\n",
    "    device = \"mps\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Load Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "if dataset == \"mnist\":\n",
    "    data = get_mnist_loader_and_transform()\n",
    "elif dataset == \"cifar10\":\n",
    "    data = get_cifar10_loader_and_transform()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Setup Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "ddpm = DDPM(\n",
    "    T = T,\n",
    "    p_cond=0.2,\n",
    "    eps_model=UNet(\n",
    "        in_channels=data.in_channels,\n",
    "        out_channels=data.out_channels,\n",
    "        T=T+1,\n",
    "        num_classes=data.num_classes,\n",
    "        steps=data.recommended_steps,\n",
    "        attn_step_indexes=data.recommended_attn_step_indexes\n",
    "    ),\n",
    "    device=device\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Train or load ready model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "if PATH_TO_READY_MODEL is not None:\n",
    "    ddpm.load_state_dict(torch.load(PATH_TO_READY_MODEL, map_location=device))\n",
    "else:\n",
    "    _, val_losses = train(\n",
    "        model=ddpm,\n",
    "        optimizer=torch.optim.Adam(params=ddpm.parameters(), lr=2e-4),\n",
    "        epochs=EPOCHS,\n",
    "        device=device,\n",
    "        train_dataloader=data.train_loader,\n",
    "        val_dataloader=data.val_loader\n",
    "    )\n",
    "\n",
    "    path = PATH_TO_SAVE_MODEL if PATH_TO_SAVE_MODEL is not None else \"model.pth\"\n",
    "\n",
    "    torch.save(ddpm.state_dict(), path)\n",
    "\n",
    "    plt.plot(val_losses, label=\"Validation Loss\")\n",
    "\n",
    "    plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Show samples"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1500x600 with 10 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n_samples = 10\n",
    "x_t = ddpm.sample(\n",
    "    n_samples=n_samples,\n",
    "    size=data.train_dataset[0][0].shape,\n",
    "    classes=[0,1,2,3,4,5,6,7,8,9],\n",
    "    w=0.2\n",
    ")\n",
    "result = []\n",
    "for i in range(x_t.shape[0]):\n",
    "    result.append(data.transform_to_pil(x_t[i]))\n",
    "\n",
    "grid = make_grid(x_t, nrow=10)\n",
    "save_image(grid, f\"sample.png\")\n",
    "\n",
    "cols = 5\n",
    "rows = (n_samples // cols) + (0 if n_samples % cols == 0 else 1)\n",
    "fig, axs = plt.subplots(rows, cols, figsize=(3 * cols, 3 * rows))\n",
    "for i in range(len(result)):\n",
    "    row = i // cols\n",
    "    axs[row, i % cols].imshow(result[i], cmap='gray' if dataset == \"mnist\" else None)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pytorch_gpu_m1",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
